package edu.uoc.tds.pec4.vista;

import edu.uoc.tds.pec4.util.ExceptionUtils;
import java.awt.BorderLayout;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import edu.uoc.tds.pec4.util.LanguageUtils;
import edu.uoc.tds.pec4.vista.base.JPanelBase;
import javax.swing.JPasswordField;
import edu.uoc.tds.pec4.model.SS4_Acceso;
import java.rmi.RemoteException;

/**
 * Tecnicas de Desarrollo de Software - (UOC)
 * Clase para visualizar la pantalla de acceso al usuario
 * @author Pedro Bauzá Picó
 * @version 1.0
 */
public class SS4_PantallaAcceso extends JPanelBase {

    private SS4_PantallaMenu SS4_PantallaMenu;
    private JLabel jlabel_NombreUsuario;
    private JLabel jlabel_Contrasenya;
    private JTextField jtextfield_NombreUsuario;
    private JPasswordField jpasswordField_Contrasenya;
    private JButton jbutton_Aceptar;
    private JButton jbutton_Cancelar;
    private JPanel panelCentral;

    public SS4_PantallaAcceso(SS4_PantallaMenu SS4_PantallaMenu) {
        super();
        this.SS4_PantallaMenu = SS4_PantallaMenu;
        iniciarComponentes();
    }

    /*
     * Método para iniciar los componentes que contiene la pantalla
     */
    private void iniciarComponentes() {
        jlabel_NombreUsuario = new JLabel(LanguageUtils.getMessage("Acceso.jlabel_NombreUsuario.titulo"));
        jlabel_NombreUsuario.setBounds(new Rectangle(200, 100, 176, 25));
        jtextfield_NombreUsuario = new JTextField();
        jtextfield_NombreUsuario.setBounds(new Rectangle(350, 100, 176, 25));
        jlabel_Contrasenya = new JLabel(LanguageUtils.getMessage("Acceso.jlabel_Contrasenya.titulo"));
        jlabel_Contrasenya.setBounds(new Rectangle(200, 160, 176, 25));
        jpasswordField_Contrasenya = new JPasswordField();
        jpasswordField_Contrasenya.setBounds(new Rectangle(350, 160, 176, 25));
        jbutton_Aceptar = new JButton();
        jbutton_Aceptar.setText(LanguageUtils.getMessage("Acceso.jbutton_Aceptar.titulo"));
        jbutton_Aceptar.setName("jbutton_Aceptar");
        jbutton_Aceptar.setBounds(new Rectangle(200, 220, 150, 25));
        jbutton_Cancelar = new JButton();
        jbutton_Cancelar.setText(LanguageUtils.getMessage("Acceso.jbutton_Cancelar.titulo"));
        jbutton_Cancelar.setName("jbutton_Cancelar");
        jbutton_Cancelar.setBounds(new Rectangle(375, 220, 150, 25));
        jbutton_Aceptar.addActionListener(SS4_PantallaMenu);
        jbutton_Cancelar.addActionListener(SS4_PantallaMenu);

        setLayout(new BorderLayout());
        panelCentral = new JPanel();
        panelCentral.setLayout(null);

        panelCentral.add(jlabel_NombreUsuario);
        panelCentral.add(jtextfield_NombreUsuario);
        panelCentral.add(jlabel_Contrasenya);
        panelCentral.add(jpasswordField_Contrasenya);
        panelCentral.add(jbutton_Aceptar);
        panelCentral.add(jbutton_Cancelar);
        add(panelCentral, BorderLayout.CENTER);
    }

    /**
     * Acción que se ejecutará al pulsar el botón
     * @param  Nombre del boton que se ha pulsado
     */
    public void componentePulsado(ActionEvent e) {
        if (e.getSource() == jbutton_Aceptar) {
            comprobarAceso();
        } else if (e.getSource() == jbutton_Cancelar) {
            SS4_PantallaMenu.setPanelCentral(new SS4_PanelInicial());
        }
    }

    /*
     * Metodo que comprueba si el usuario tiene acceso
     */
    private void comprobarAceso() {
        String validarCamposObligatoriosMessage = validarCamposObligatorios(jtextfield_NombreUsuario.getText(), jpasswordField_Contrasenya.getText());
        if ("".equals(validarCamposObligatoriosMessage)) {
            try {
                //Comprobamos la existencia del usuario en el sistema, y recuperamos objeto acceso con los atributos
                SS4_Acceso acceso = this.SS4_PantallaMenu.getRemotoConexion().comprobarLoguin(jtextfield_NombreUsuario.getText(), jpasswordField_Contrasenya.getText());
                if (acceso != null) {
                    this.SS4_PantallaMenu.activarMenu(acceso.getTipo_usuario());
                    this.SS4_PantallaMenu.setAcceso(acceso);
                    SS4_PantallaMenu.setPanelCentral(new SS4_PanelInicial());
                    ExceptionUtils.visualizarInformacion(LanguageUtils.getMessage("Acceso.INF_Bienvenido") + " " + acceso.getNombre() + " " + acceso.getApellido1());
                } else {
                    ExceptionUtils.visualizarError(ExceptionUtils.Err_UsuarioIncorrecto);
                }
            } catch (RemoteException ex) {
                ExceptionUtils.visualizarError(ExceptionUtils.ERR_Remote);
            } catch (Exception ex) {
                ExceptionUtils.visualizarError(LanguageUtils.getMessage("Acceso.ERR_Acceso"));
            }
        } else {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("Acceso.CamposObligatorios") + validarCamposObligatoriosMessage);
        }
    }

    /*
     * Metodo que comprueba que se han introducido los campos obligatorios
     */
    private String validarCamposObligatorios(String p_NombreUsuario, String p_Contrasenya) {

        StringBuilder campos = new StringBuilder();
        if (p_NombreUsuario == null || "".equals(p_NombreUsuario)) {
            campos.append(LanguageUtils.getMessage("Acceso.CampoObligatorio.NombreUsuario"));
        }
        if (p_Contrasenya == null || "".equals(p_Contrasenya)) {
            campos.append(LanguageUtils.getMessage("Acceso.CampoObligatorio.Contrasenya"));
        }
        return campos.toString();
    }
}
